import 'package:flutter/material.dart';
import 'package:petitparser/petitparser.dart';

///这个解析器，用于解析形如 "[数字] + [数字]" 的字符串。
class EBuildParser extends StatefulWidget {
  const EBuildParser({super.key});

  @override
  State<EBuildParser> createState() => _EBuildParserState();
}

class _EBuildParserState extends State<EBuildParser> {
  var resultStr = '';
  final invalidStr = 'Invalid input';
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text('构建解析器'),
        ),
        body: SingleChildScrollView(
          child: Container(
            padding: EdgeInsets.all(16),
            child: Column(
              children: [
                Text('待解析数据"1 + 2"'),
                SizedBox(height: 10),
                TextButton(
                    onPressed: () {
                      _buildParser();
                      setState(() {});
                    },
                    child: Text('开始解析')),
                Text('解析结果："'),
                SizedBox(height: 10),
                Container(
                  color: const Color.fromARGB(255, 224, 224, 224),
                  child: Text(resultStr),
                ),
              ],
            ),
          ),
        ));
  }

//**首先创建了一个 digitParser，它会解析一个数字字符并将其转换为整数。
//然后，我们创建了一个 operatorParser，它会解析 '+' 字符并忽略其两边的空白字符。
//然后，我们使用 seq 方法将这两个解析器组合成一个 expressionParser，
//它会解析形如 "[数字] + [数字]" 的字符串。
//然后，我们使用这个 expressionParser 来解析字符串 '1 + 2'。
//如果解析成功，我们会打印出两个数字的和。
//如果解析失败，我们会打印 'Invalid input'。 */
  List<String> _buildParser() {
    final digitParser = digit().flatten().map(int.parse);
    final operatorParser = char('+').trim();
    final expressionParser = digitParser.seq(operatorParser).seq(digitParser);

    final result = expressionParser.parse('1 + 2');
    if (result.isSuccess) {
      final values = result.value;
      final firstNumber = values[0];
      final secondNumber = values[2];
      resultStr = '$firstNumber\n\n$secondNumber';
      return [firstNumber.toString(), secondNumber.toString()];
    } else {
      resultStr = 'Invalid input';
      return ['Invalid input'];
    }
  }
}
